БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Класс  ΠΎΠΊΠ½Π°Β  Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ…Β  систСмах,Β  ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅Β  классы, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅Β  ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅Β  Π΄Π°Π½Π½Ρ‹Ρ…Β  ΠΎΠΊΠ½Π°Β  ΠΈ класса

БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

1. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π’ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах (ОБ), Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Windows, ΠΎΠΊΠ½Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ основными элСмСнтами графичСского интСрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (GUI). КаТдоС ΠΎΠΊΠ½ΠΎ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ классу, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, внСшний Π²ΠΈΠ΄ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Класс ΠΎΠΊΠ½Π° β€” это шаблон, Π½Π° основС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ экзСмпляры ΠΎΠΊΠΎΠ½.

Класс  ΠΎΠΊΠ½Π°Β  Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ…Β  систСмах
БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

2. ΠŸΠΎΠ½ΡΡ‚ΠΈΠ΅ класса ΠΎΠΊΠ½Π°

Класс ΠΎΠΊΠ½Π° β€” это структура Π΄Π°Π½Π½Ρ‹Ρ…, которая содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ:

  • ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ ΠΎΠΊΠ½Π° (Window Procedure) β€” функция, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π°Ρ сообщСния, отправляСмыС ΠΎΠΊΠ½Ρƒ.
  • Бтилях ΠΎΠΊΠ½Π° (Window Styles) β€” ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ внСшний Π²ΠΈΠ΄ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠΊΠ½Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρ€Π°ΠΌΠΊΠΈ, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, ΠΊΠ½ΠΎΠΏΠΎΠΊ управлСния).
  • ИконкС ΠΈ курсорС β€” рСсурсы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΎΠΊΠ½ΠΎΠΌ.
  • Π€ΠΎΠ½Π΅ ΠΎΠΊΠ½Π° β€” Ρ†Π²Π΅Ρ‚ ΠΈΠ»ΠΈ ΠΊΠΈΡΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ для Π·Π°Π»ΠΈΠ²ΠΊΠΈ Ρ„ΠΎΠ½Π°.
  • МСню β€” мСню ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, связанноС с ΠΎΠΊΠ½ΠΎΠΌ.

Класс ΠΎΠΊΠ½Π° рСгистрируСтся Π² систСмС ΠΏΠ΅Ρ€Π΅Π΄ созданиСм ΠΎΠΊΠ½Π°.

Класс  ΠΎΠΊΠ½Π°Β  Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ…Β  систСмах
БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

3. ΠŸΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ классы ΠΎΠΊΠΎΠ½

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ систСмы ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π½Π°Π±ΠΎΡ€ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания стандартных ΠΎΠΊΠΎΠ½. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… классов Π² Windows:

  • BUTTON β€” класс для создания ΠΊΠ½ΠΎΠΏΠΎΠΊ.
  • EDIT β€” класс для создания тСкстовых ΠΏΠΎΠ»Π΅ΠΉ.
  • LISTBOX β€” класс для создания списков.
  • COMBOBOX β€” класс для создания ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… списков.
  • STATIC β€” класс для создания статичСских тСкстовых элСмСнтов.

Π­Ρ‚ΠΈ классы ΡƒΠΆΠ΅ зарСгистрированы Π² систСмС, ΠΈ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ рСгистрации.

Класс  ΠΎΠΊΠ½Π°Β  Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ…Β  систСмах
БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

4. РСгистрация ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса ΠΎΠΊΠ½Π°

Если ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ классы Π½Π΅ подходят, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ собствСнный класс ΠΎΠΊΠ½Π°. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция RegisterClass ΠΈΠ»ΠΈ RegisterClassEx (Π² Windows). ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

WNDCLASS wc = {};
wc.lpfnWndProc = WindowProc; // Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΎΠΊΠ½Π°
wc.hInstance = hInstance;    // ДСскриптор экзСмпляра прилоТСния
wc.lpszClassName = L"MyWindowClass"; // Имя класса

// РСгистрация класса
RegisterClass(&wc);

ПослС рСгистрации класса ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠΊΠ½Π° Π½Π° Π΅Π³ΠΎ основС.

Класс  ΠΎΠΊΠ½Π°Β  Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ…Β  систСмах
БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

5. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠΊΠ½Π° ΠΈ класса

Для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ΠΎΠΊΠ½Π΅ ΠΈ Π΅Π³ΠΎ классС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

  • GetWindowInfo β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΎΠΊΠ½Π΅.
  • GetClassInfo β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ классС ΠΎΠΊΠ½Π°.
  • GetClassName β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ имя класса, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΎΠΊΠ½ΠΎ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

TCHAR className[256];
GetClassName(hwnd, className, 256); // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ класса ΠΎΠΊΠ½Π°
Класс  ΠΎΠΊΠ½Π°Β  Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ…Β  систСмах
БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

6. ИзмСнСниС Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠΊΠ½Π° ΠΈ класса

НСкоторыС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΎΠΊΠ½Π° ΠΈ класса ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ динамичСски:

  • SetWindowLong β€” измСняСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΎΠΊΠ½Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, стили).
  • SetClassLong β€” измСняСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ класса (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠΊΠΎΠ½ΠΊΡƒ ΠΈΠ»ΠΈ курсор).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

SetWindowLong(hwnd, GWL_STYLE, WS_OVERLAPPEDWINDOW); // ИзмСнСниС стиля ΠΎΠΊΠ½Π°
SetClassLong(hwnd, GCL_HICON, (LONG)newIcon); // ИзмСнСниС иконки класса
Класс  ΠΎΠΊΠ½Π°Β  Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ…Β  систСмах
БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

7. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ создания ΠΎΠΊΠ½Π° с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ классом:

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}
Класс  ΠΎΠΊΠ½Π°Β  Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ…Β  систСмах
БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    WNDCLASS wc = {};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = L"MyWindowClass";

    RegisterClass(&wc);

    HWND hwnd = CreateWindowEx(0, L"MyWindowClass", L"МоС окно", WS_OVERLAPPEDWINDOW,
                               CW_USEDEFAULT, CW_USEDEFAULT, 500, 300, NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);

    MSG msg = {};
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}
Класс  ΠΎΠΊΠ½Π°Β  Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ…Β  систСмах
БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

8. Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Класс ΠΎΠΊΠ½Π° β€” это ваТная концСпция Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ графичСских интСрфСйсов. ПониманиС Ρ€Π°Π±ΠΎΡ‚Ρ‹ с классами ΠΎΠΊΠΎΠ½ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π³ΠΈΠ±ΠΊΠΈΠ΅ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ прилоТСния. ΠŸΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ классы ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ, Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ рСгистрации ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… классов ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΡˆΠΈΡ€ΠΎΠΊΠΈΠ΅ возмоТности для кастомизации.

Класс  ΠΎΠΊΠ½Π°Β  Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ…Β  систСмаΡ